2016-10-26 48 views
3

我正在使用两个ListViews(List1有数据,List2为空)。ListView在更改数据后未更新

用户可以输入名称作为输入,如果List1包含名称,并且按下添加Button,那么标记应该减1,并且ListViews应该被更新。

例子:

如果列表1有10个标记,并输入名称,然后列表1应该有标志设置为9和List2应该标记设置为1

如果我们这样做10次,然后list1的名称应该被删除,列表2已标记设置为10。

实施例2:

假设List1中具有标记设置为8和丽丝t2标记设置为2.如果按下子按钮,则应添加两个列表。在这一点上,List2应该被删除,List1应该有总分数为10.

以下是我用过的逻辑,但它不工作,它创建多行并标记哪些不正确更新。

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> 

这里是预期输出的图像: Expected Output

在上面的输出,乔伊有10个标记和如果 “喜悦” 被输入作为输入,然后清单应如上所示。

我真的可以使用帮助,在此先感谢。

+0

表我运行代码后看到。你的名字叫约翰。有两个项目,其中一个更新点击添加。现在我不太明白你想要什么,什么不工作。它不清楚 – Raghunandan

+0

如果名称如果匹配,则标记为10,那么标记应该减1,并添加到列表2,标记为1,列表1标记应为9. – Balaji

+0

好的。但是你有什么是n ++;然后'docDet1.get(j).marks = n;'。所以它不清楚。你可以发布快照,你需要什么 – Raghunandan

回答

2

从我的理解,如果在EDITTEXT输入的名称列表中的名称一致通过1.减少标记相同的内容添加到列表中2,并设置标志为1

如果单击添加为同名称列表1标记名称减少而列表2中的标记变为2。对于部分添加

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; 
} 

避免调用notifyDataSetChanged里面的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; 
} 
相关问题