2017-09-15 19 views
0

ListViewの各行にButtonとTextViewがあるListViewinがあるアプリケーションを開発しています。値を増やして、ボタンクリック時のTextViewにTextViewで表示したいのですが、ボタンをクリックすると、行ごとに値が増えますが、最後の行のTextViewの変更はすべての行でクリックされたボタンに関係なく表示されます。同じ行のTextViewの中の特定の行の変更を表示する方法各TextViewの各行の変更された値を反映する方法

ここ

が私のコードです:

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyAd.customButtonListener { 


    ListView lv; 

int q=0; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    lv= (ListView) findViewById(R.id.list); 
     MyAd ma=new MyAd(this); 
     ma.setCustomButtonListner(this); 
     lv.setAdapter(ma); 

    } 


    @Override 
    public void onButtonClickListner(int position,TextView t) { 
     q=q+1; 
     t.setText(""+q); 
    } 
} 

MyAd.java

class MyAd extends BaseAdapter { 
    int q = 0, a[]; 
    List<ListItem> li = new ArrayList<>(); 
    Context c; 
    MyViewHolder mvh; 
    customButtonListener customListner; 


    MyAd(Context c) { 
     this.c = c; 
     Resources res = c.getResources(); 
     String title[] = res.getStringArray(R.array.title); 
     a = new int[title.length]; 


     for (int i = 0; i < title.length; i++) { 
      li.add(new ListItem(title[i])); 
     } 
    } 


    public interface customButtonListener { 
     void onButtonClickListner(int position, TextView t); 
    } 


    public void setCustomButtonListner(customButtonListener listener) { 
     this.customListner = listener; 
    } 


    @Override 
    public int getCount() { 
     return li.size(); 
    } 

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

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


    @Override 
    public View getView(final int position, View view, ViewGroup parent) { 
     View row = view; 


     if (row == null) { 

      LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.list_item, parent, false); 
      mvh = new MyViewHolder(row); 

      row.setTag(mvh); 
     } else { 
      mvh = (MyViewHolder) row.getTag(); 
     } 


     ListItem sr = li.get(position); 
//String s=sr.title; 
     mvh.txt.setText(sr.title); 


     mvh.bt.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       q = a[position]; 

       q++; 

       a[position] = q; 
       mvh.quan.setText(String.valueOf(a[position])); 
       System.out.println("position:" + position + "-" + q); 
       System.out.println("array: " + Arrays.toString(a)); 
      } 
     }); 

     notifyDataSetChanged(); 
     return row; 
    } 


    class MyViewHolder { 
     TextView txt, quan; 
     Button bt; 

     MyViewHolder(View row) { 
      txt = row.findViewById(R.id.txt); 
      quan = row.findViewById(R.id.quan); 
      bt = row.findViewById(R.id.button); 
     } 
    } 

} 

ListItem.java

public class ListItem { 

    String title; 

    ListItem(String title) 
    { 
     this.title=title; 
    } 


} 
+0

私は私が提案し何をしようと@AnkitSrivastava getViewメソッド()メソッド –

答えて

0

)は、(インスタンスとして変数

MyViewHolder mvh; 

を取り外し、getViewメソッド内のローカル変数として宣言 -

final MyViewHolder mvh; 

によりインスタンス変数に、MVHは常に最後膨張ビューホルダーを保持し、したがって、最後に表示されるアイテムは、常に更新されます。

+0

を呼び出していません –

+0

にそのオブジェクトを作成することができません、それは最終的に作る場合は、私はそれが動作チェック..コールバックメソッドonButtonClickListner() – nomag

関連する問題