1

同様の問題ですべてのトピックを確認しましたが、まだデッドポイントにとどまっています。連絡先リストを含むリストビューがありますが、下にスクロールしてリストビューを上にスクロールすると、選択した状態が保存されません。すべてのチェックボックスが false に設定されていました。デバッグすると、リストビューをスクロールすると、チェックボックスが署名されていると考えているonClickListenerが表示され、これがリセットされます。私はすべて、位置ブール値を持つ他の配列などを行いますが、まだ何をすべきかわかりません:(私はどんな助けにも非常に感謝しています:)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        readContacts();
        Contact_Database dbhandler = new Contact_Database(
                getApplicationContext(), null, null, 1);
        numbers.addAll( dbhandler.getAllNumbers());
        System.out.println("onCreate");
        ListView lv = getListView();
        registerForContextMenu(lv);
        lv.setTextFilterEnabled(true);
        lv.clearChoices();
        MyAdapter adapter = (new MyAdapter(this, R.layout.contact_list_sms, contacts));
        adapter.notifyDataSetChanged();
        lv.setAdapter(adapter);

    }

    /**
     * When I destroy intent i send request to database, faster!
     */

    @Override
    protected void onDestroy() {
        super.onDestroy();
        for (int i = 0; i < numbers.size(); ++i)
            System.out.println("@@@@" + numbers.get(i));

        swap_contacts();

    }

class MyAdapter extends ArrayAdapter<Contact> {

        LayoutInflater inflat;

        public MyAdapter(Context context, int textViewResourceId,
                ArrayList<Contact> objects) {
            super(context, textViewResourceId, objects);
            inflat = LayoutInflater.from(context);
            System.out.println("LOLLLLL");
            notifyDataSetChanged();

        }

        @Override
        public int getItemViewType(int position) {
            return (position == this.getCount() - 1) ? 1 : 0;
        }

        @Override
        public int getViewTypeCount() {
            return 2;
        }

        // if that contact exist in database? numbers, in onCreate method
        // i init this with saved position from databse
        private boolean exist(String x) {
            for (int i = 0; i < numbers.size(); i++)
                if (numbers.get(i).compareTo(x) == 0)
                    return true;
            return false;
        }

        @SuppressLint("NewApi")
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("ROWS !!! ->" + numbers.size());
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflat.inflate(R.layout.contact_row, null);
                holder.textView1 = (TextView) convertView
                        .findViewById(R.id.name);
                holder.textView2 = (TextView) convertView
                        .findViewById(R.id.number);
                holder.on_off = (CheckBox) convertView
                        .findViewById(R.id.enable);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            Contact it = contacts.get(position);
            Log.v("XXX", holder.toString());
            if (it != null) {
                holder.textView1.setText(contacts.get(position).name);
                holder.textView2.setText(contacts.get(position).phone);
                // update state of checbox from database
                if (exist(contacts.get(position).phone))
                    holder.on_off.setChecked(true);
                else
                    holder.on_off.setChecked(false);
            }

            final int element_position = position;

            holder.on_off
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {
                        // update list when we click on it
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            String nr_telefonu = contacts.get(element_position).phone;
                            if (isChecked) {
                                numbers.add(nr_telefonu);
                            } else {
                                numbers.remove(nr_telefonu);
                            }
                        }
                    });
            return convertView;
        }


        @Override
        public Contact getItem(int position) {
            return contacts.get(position);
        }

        private class ViewHolder {
            TextView textView1, textView2;
            CheckBox on_off;

            public String toString() {
                return "-";
            }
        }
    }
4

3 に答える 3

0

この問題の解決策を以下に投稿しましたが、見つけるのに多くの時間を費やしましたが、うまくいきました!

public class RowAdapter extends ArrayAdapter<Rows> {

	Context context; 
    int layoutResourceId;    
    ArrayList<Rows> data;
    boolean[] checkBoxState;
    RowHolder rowHolder;
	
	
	public RowAdapter(Context context, int layoutResourceId, ArrayList<Rows> data) {
		super(context, layoutResourceId, data);
		
		this.layoutResourceId = layoutResourceId;
		this.context = context;
		this.data = data;
		
		checkBoxState = new boolean[data.size()];
	}
	

	@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        RowHolder holder = null;
        
        
        if(row == null)
        {
            	
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new RowHolder();

holder.textView1 = (TextView)row.findViewById(R.id.textView1);
            holder.textView2 = (TextView)row.findViewById(R.id.textView2);
            holder.textView3 = (TextView)row.findViewById(R.id.textView3);
            holder.textView4 = (TextView)row.findViewById(R.id.textView4);
            holder.checkBox=(CheckBox) row.findViewById(R.id.checkBox1);
         
            
            row.setTag(holder);
        }
        else{
        
        	holder = (RowHolder)row.getTag();
            }
    
        
        Rows rows = data.get(position);
        holder.textView1.setText(rows.address);
        holder.textView2.setText(rows.tenancy);
        holder.textView3.setText(rows.location);
        holder.textView4.setText(rows.name);
        
        holder.checkBox.setChecked(checkBoxState[position]);

holder.checkBox.setOnClickListener(new View.OnClickListener() {
            
        	   public void onClick(View v) {
        	    if(((CheckBox)v).isChecked())
        	     checkBoxState[position]=true;
        	    else
        	     checkBoxState[position]=false;
        	      
        	    }
        	   });
       
        
        return row;
    }
    
    static class RowHolder
    {
    	TextView textView1;
        TextView textView2;
        TextView textView3;
        TextView textView4;
        CheckBox checkBox;
    }
    
  

    
    
}
        

于 2015-03-26T05:00:50.687 に答える