1

何が問題なのですか?リストビューがあり、リスト項目をクリックして項目の背景を変更したい.項目を選択してから別の項目をクリックすると、背景を別の項目に切り替えます。これが単一選択プロセスです

if (convertView == null)  
{  
convertView = mInflater.inflate(R.layout.customer_account_customview, null);  
holder = new ViewHolder();
holder.tr = (TableRow)convertView.findViewById(R.id.tableRow);
convertView.setTag(holder);
}  
else  
{  
holder = (ViewHolder) convertView.getTag();
}
holder.tr.setTag((Integer)position);

holder.tr.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view)
{
    int tableRowPosition=(new Integer((Integer) view.getTag())).intValue();
    Log.i("Position of Row click", ""+tableRowPosition);
    holder.tr.setBackgroundDrawable(getResources().getDrawable(R.drawable.abc));
}
});

enter image description here

class CustomerAccountAdapter extends BaseAdapter
     {

         public CustomerAccountAdapter() {
             mInflater = LayoutInflater.from(CustomerAccount.this);
             selectedIds = new ArrayList<Integer>();
        }

         @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return arraylist_invoices.size();
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return arraylist_invoices.get(position);
            }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            vvw = convertView;

            Log.i("inside", "getView()");

            if (vvw == null)  
            {  
            vvw = mInflater.inflate(R.layout.customer_account_customview, null);  
            holder = new ViewHolder();

            holder.tableRow = (TableRow)vvw.findViewById(R.id.tableRow10);


                vvw.setTag(holder);
            }  
            else  
            {  
                holder = (ViewHolder) vvw.getTag();
            }           
            holder.tableRow.setTag((Integer)position);

            holder.tableRow.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    // TODO Auto-generated method stub
                    Integer myIntegerObject=new Integer((Integer) view.getTag());
                    tableRowPosition=myIntegerObject.intValue();
                    Log.i("Position of Row click", ""+tableRowPosition);

                //  notifyDataSetChanged();
                //  holder.tableRow.setBackgroundResource(R.drawable.table_heading_shape);

                //  holder.tableRow.setBackgroundDrawable(getResources().getDrawable(R.drawable.cancel_big_butt));
                    notifyDataSetChanged();
                //  holder.tableRow.setBackgroundResource();

                }
            });

                return vvw;

        }
     }
        private class ViewHolder
    {  
        TextView txtDate, txtInv, txtAmt, txtPaid, txtBal,txtDays;
        TableRow tableRow;// All TextView inside TableRow
    }
4

1 に答える 1

1

各リスト項目の背景状態を保存する必要があり、getView メソッドでそれを参照して、適用する背景を決定します。したがって、リスト内のクラスにメンバー変数を追加するか、リストと同じ数の要素を持つ 2 つ目の配列を作成し、アイテムの位置を使用して状態を取得することができます。

同様のことを行う2つの異なるクラスを投稿したので、少し混乱しています。したがって、これはクラスと正確に一致しない場合がありますが、次のように ViewHolder クラスにブール値を追加します。

private class ViewHolder
{  
    TextView txtDate, txtInv, txtAmt, txtPaid, txtBal,txtDays;
    TableRow tableRow;// All TextView inside TableRow
    boolean backgroundChanged = false;
}

次に、直前にreturn vvw;

holder.tr.setBackgroundDrawable( getResources().getDrawable( 
    holder.backgroundChanged? R.drawable.theDefaultBackground : R.drawable.abc
));

そして、onClickListener で、押されたときにこの値も保存する必要があります。

public void onClick(View view)
{
    int tableRowPosition=(new Integer((Integer) view.getTag())).intValue();
    Log.i("Position of Row click", ""+tableRowPosition);
    holder.tr.setBackgroundDrawable(getResources().getDrawable(R.drawable.abc));
    holder.backgroundChanged = true;
}

ところで、ビューが画面にスクロールするたびに同じ onClickListener の新しいコピーを作成しているため、アニメーションがスムーズでなくなる可能性があります。getView のすべてのビューに適用される単一の onClickListener を作成することをお勧めします。

于 2013-10-05T15:52:01.007 に答える