更改数据后,ListView不会更新 [英] ListView is not updating after changes to data

查看:81
本文介绍了更改数据后,ListView不会更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用两个ListViews(List1有数据,List2为空).

I am using two ListViews (List1 has data and List2 is empty).

用户可以输入名称作为输入,如果List1包含名称并且按下添加Button,则标记应减少1,并且两个ListViews都应更新.

The user can enter a name as input and if List1 contains name and the add Button is pressed then marks should be decreased by 1 and both the ListViews should be updated.

示例:

如果List1有10个标记并输入了名称,则List1的标记应设置为9,List2的标记应设置为1.

If List1 has 10 marks and a name is entered then List1 should have marks set to 9 and List2 should have marks set to 1.

如果我们这样做10次,则应删除List1名称,并且List2的标记设置为10.

If we did this 10 times then List1 names should be removed and List2 has marks set to 10.

示例2:

假设List1的标记设置为8,List2的标记设置为2.如果按下了子按钮,则应该同时添加两个列表.此时,应该删除List2,并且List1的总分应为10.

Suppose List1 has marks set to 8 and List2 marks set to 2. If the sub button is pressed then both should lists should be added. At this point, List2 should be deleted and List1 should have total marks as 10.

以下是我使用的逻辑,但是它无法正常工作,它正在创建多行和标记,这些行和标记无法正确更新.

Below is the logic I have used however it is not working it is creating multiple rows and marks which not updating properly.

HomeAct类

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle; 
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class HomeAct extends Activity {

List<DocItem> docDet1 = new ArrayList<DocItem>();
List<DocItem> docDet2 = new ArrayList<DocItem>();
ListView lv1, lv2;
EditText editText;
Button btn1, btn2;
DocDetAdapter adapter1, adapter2;
int n=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_act);
    lv1 = (ListView)findViewById(R.id.lv_det1);
    lv2 = (ListView)findViewById(R.id.lv_det2);
    editText = (EditText)findViewById(R.id.editText1);
    btn1 = (Button)findViewById(R.id.btn1);
    btn2 = (Button)findViewById(R.id.btn2);
    adapter1 = new DocDetAdapter(1);
    adapter2 = new DocDetAdapter(2);

    docDet1.add(new DocItem("1", "john", 20));
    docDet1.add(new DocItem("2", "james", 5));
    docDet1.add(new DocItem("3", "shaun", 60));
    docDet1.add(new DocItem("4", "joy", 10));
    docDet1.add(new DocItem("5", "mark", 1));

    lv1.setAdapter(adapter1);
    lv2.setAdapter(adapter2);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            for(int j =0;j<docDet1.size();j++){
                final DocItem curItem = docDet1.get(j);
                if(curItem.name.equals(editText.getText().toString())){
                    n++;
                 DocItem docItem = docDet1.get(j);
                    docDet1.get(j).marks = n;
                    docDet2.add(0, docItem);
                    adapter1.notifyDataSetChanged();
                    adapter2.notifyDataSetChanged();
                    editText.setText("");
                    }
                }
            editText.setText("");
        }
    });

    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            for(int j =0;j<docDet2.size();j++){
                final DocItem curItem = docDet2.get(j);
                if(curItem.name.equals(editText.getText().toString())){

                 DocItem docItem = docDet1.get(j);
                    docDet2.remove(j);
                    docDet1.add(0, docItem);
                    adapter1.notifyDataSetChanged();
                    adapter2.notifyDataSetChanged();
                    editText.setText("");
                    }
                }
            editText.setText("");
        }
    });
}

private class DocDetAdapter extends BaseAdapter {

    int mode; // 1 or 2

    public DocDetAdapter(int mode) {
        this.mode = mode;
    }

    @Override
    public int getCount() {
        if (mode == 1)
            return docDet1.size();
        else
            return docDet2.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        LayoutInflater li = getLayoutInflater();

        if (convertView == null)
            convertView = li.inflate(R.layout.row_tray_det, null);

        TextView tvItemName = (TextView) convertView
                .findViewById(R.id.tv_item_name);
        TextView tvRack = (TextView) convertView.findViewById(R.id.tv_rack);
        TextView tvQty = (TextView) convertView.findViewById(R.id.tv_qty);

        DocItem invItem;
        if (mode == 1)
            invItem = docDet1.get(position);
        else
            invItem = docDet2.get(position);

        tvItemName.setText(invItem.docNo);
        tvRack.setText(invItem.name);
        tvQty.setText(invItem.marks + "");

        return convertView;
        }
    }
  }

DocItem类

public class DocItem {

public String docNo, name;
public Integer marks;

public DocItem(String docNo, String name, Integer marks) {
    super();
    this.docNo = docNo;
    this.name = name;
    this.marks = marks;
     }
  }

home_act.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="3"
        android:text="Add" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="3"
        android:text="Sub" />
</LinearLayout>

<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:gravity="center"
    android:text="list 1"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

<ListView
    android:id="@+id/lv_det1"
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:layout_marginTop="10dp" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:gravity="center"
    android:text="list 2"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

<ListView
    android:id="@+id/lv_det2"
    android:layout_width="fill_parent"
    android:layout_height="250dp" />

 </LinearLayout>

row_tray_det

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
    android:orientation="vertical" >

    <View
    android:id="@+id/v_doc_seperator"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:background="@color/blue"
    android:visibility="gone" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/row_bg_transparent_white"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_rack"
        style="@android:style/TextAppearance.Medium"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="5"
        android:gravity="center_vertical"
        android:padding="10dp"
        android:text="Sl no"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Name"
        android:textSize="15sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_qty"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:ems="10"
        android:gravity="center_vertical"
        android:paddingRight="3dp"
        android:text="Marks"
        android:textSize="16sp"
        android:textStyle="bold" />
</LinearLayout>

以下是预期输出的图像:

在上面的输出中,Joy有10个标记,如果输入"Joy"作为输入,则列表应如上所示.

In the above output, Joy had 10 marks and if "Joy" is entered as input then list should shown as above.

我真的可以使用帮助,谢谢.

I could really use help, thanks in advance.

推荐答案

据我了解,是否在editText中输入的名称与列表中的名称匹配,将标记减少1.将相同的内容添加到列表2并将标记设置为1.

From what i understand if the name entered in editText matches the name in the list reduce marks by 1. Add the same content to the list 2 and set marks as 1.

如果您为同一名称列表单击添加,则名称的标记将减少,而list2中的标记将变为2.

If you click add for the same name list 1 marks for the name reduces while marks in list2 becomes2.

要对添加部分进行更改

 btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            DocItem changeItem = null;
            for (int i = 0; i < docDet1.size(); i++) {
                DocItem docItem = docDet1.get(i);
                if (docItem.name.equals(editText.getText().toString())) {
                    changeItem = docDet1.get(i);
                    changeItem.marks = changeItem.marks - 1;
                    if (findDocItem(editText.getText().toString()) != null) {
                        DocItem docI = findDocItem(editText.getText().toString());
                        docI.marks = docI.marks + 1;
                    } else {
                        docDet2.add(new DocItem(changeItem.docNo, changeItem.name, 1));
                    }

                }

            }

            adapter2.notifyDataSetChanged();
            adapter1.notifyDataSetChanged();
        }
    });

要查找和物品

  DocItem findDocItem(String name) {
    for (DocItem item : docDet2) {
        if (item.name.equals(name)) {
            return item;
        }
    }
    return null;
}

避免在for循环内调用notifyDataSetChanged.

Avoid calling notifyDataSetChanged inside the for loop.

您将对sub做类似的事情.

You would do something similar for sub.

对于聊天中的子部分

    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            int changedmarks=0;
            for (int i = 0; i < docDet2.size(); i++) {
                DocItem docItem = docDet2.get(i);
                if (docItem.name.equals(editText.getText().toString())) {
                    changedmarks =docDet2.get(i).marks;
                    docDet2.remove(i);

                }
            }
            if(findDocItem2(editText.getText().toString())!=null )
            {
                DocItem  docitem = findDocItem2(editText.getText().toString());
                docitem.marks = docitem.marks+ changedmarks;
            }

            adapter1.notifyDataSetChanged();
            adapter2.notifyDataSetChanged();
        }
    });

然后

DocItem findDocItem2(String name) {
    for (DocItem item : docDet1) {
        if (item.name.equals(name)) {
            return item;
        }
    }
    return null;
 }

这篇关于更改数据后,ListView不会更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆