Android, как определить элемент в списке с помощью флажка - PullRequest
3 голосов
/ 25 февраля 2012

Я действительно застрял здесь. То, что я хочу, не просто (для меня), однако я программирую Android уже год. То, что я хочу, - это просмотр списка с изображением, просмотр текста, флажок и еще один просмотр текста в каждой строке. Давайте сначала будем иметь текстовое представление и флажок в макете. Основываясь на этом уроке, мне удалось это сделать (их много, но мне кажется, это лучше). У меня есть представление списка, заполненное текстовыми представлениями и флажками.

Это результат:

enter image description here

Вот так я получаю текст textview, на который я нажимаю:

 textView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            TextView tv = (TextView) v ;
            String text_of_clicked_textview = tv.getText().toString();
            Log.i("TAG", "" + text_of_clicked_textview);
        }
    });

Итак, когда я нажимаю на Меркурий, я получаю Меркурий в переменной text_of_clicked_textview.

Но как я могу проверить, на какой флажок я нажал? Например, я нажимаю на 3-й флажок, я хочу, чтобы он был в ряду Земли. Лучше всего, если я узнаю как текст textview в строке списка ( Earth ), так и номер элемента ( 3 ).

Полагаю, мне нужно установить onClickListener на флажок, но что дальше?

checkBox.setOnClickListener( new View.OnClickListener() {
      public void onClick(View v) {
        CheckBox cb = (CheckBox) v ;

      }
    });

Ответы [ 4 ]

12 голосов
/ 25 февраля 2012

Это XML для пользовательской строки в ListView:

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

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/camera_icon" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" 
     />

</LinearLayout>

Это завершенная операция, в которой реализован список: Просто скопируйте это упражнение для проверки, а затем поймите код. Поместите один просмотр списка в основное задание

package com.DemoTest;

import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class CustomList extends Activity implements OnClickListener
{

    ListView listView;
    ArrayList<EachRow> list=new ArrayList<CustomList.EachRow>();
    EachRow each;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String[] color={"red","green","blue","white","yellow","cyan","purple","grey",
                "0red","0green","0blue","0white","0yellow","0cyan","0purple","0grey",
                "1red","1green","1blue","1white","1yellow","1cyan","1purple","1grey"};
        for(String str : color)
        {
            each=new EachRow();
            each.text=str;
            list.add(each);
        }
        listView=(ListView)findViewById(R.id.listView1);
        listView.setAdapter(new MyAdapter(this, 0, list)); 
        //listView.setOnItemClickListener(this);
    }
    class MyAdapter extends ArrayAdapter<EachRow>
    {
        LayoutInflater inflat;
        ViewHolder holder;
        public MyAdapter(Context context, int textViewResourceId,
                ArrayList<EachRow> objects) 
        {
            super(context, textViewResourceId, objects);
            // TODO Auto-generated constructor stub
            inflat=LayoutInflater.from(context);
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            if(convertView==null)
            {
                convertView=inflat.inflate(R.layout.row_checkox, null);
                holder=new ViewHolder();
                holder.textView=(TextView)convertView.findViewById(R.id.textView1);
                holder.image=(ImageView)convertView.findViewById(R.id.imageView1);
                holder.check=(CheckBox)convertView.findViewById(R.id.checkBox1);
                holder.check.setOnClickListener(CustomList.this);
                convertView.setTag(holder);
            }
            holder=(ViewHolder) convertView.getTag();
            EachRow row= getItem(position);
            Log.d("size", row.text);
            holder.textView.setText(row.text); 
            holder.check.setChecked(row.checkBool); 
            holder.check.setTag(position);
            return convertView;
        }

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

        private class ViewHolder
        {
            TextView textView;
            ImageView image;
            CheckBox check;
        }
    }
    private class EachRow
    {
        String text;
        boolean checkBool;
    }



    @Override
    public void onClick(View v) 
    {
        // TODO Auto-generated method stub

        EachRow row=list.get((Integer)v.getTag());
         row.checkBool=!row.checkBool;
         Log.d("item", "Item Click at "+(Integer)v.getTag()+" : "+row.text+" is "+row.checkBool); 
    }

}
1 голос
/ 25 февраля 2012

Лучше, чем добавлять onClickListener к каждому флажку, вы также можете использовать ItemClickListener в своем списке.

Обратитесь к этому сообщению, чтобы узнать строку, по которой щелкнули: onItemClickstrings.xml (не ListView / ArrayList)

Существуют и другие параметры, но они включают создание пользовательского класса виджета строки и передачу его позиции в строке, когда адаптер создает или обновляет его.

0 голосов
/ 25 февраля 2012

Если вас интересует только текст и флажок, вы можете использовать это

В XML:

<ListView
    android:id="@+id/listViewCursor"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:choiceMode="multipleChoice" >

String[] color={"red","green","blue","white","yellow","cyan","purple","grey"};

list.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, color));

И при некоторых событиях проверяйте, какие флажки установлены.

SparseBooleanArray boolArray=list.getCheckedItemPositions();
        int size=list.getCount();
        for(int i=0;i<size;i++)
        {
            if(boolArray.valueAt(i)==true)
            {
                Log.d("size", color[i]);
            }
        }
0 голосов
/ 25 февраля 2012

у вас должен быть onTouchListener на контейнере, который содержит их все, и убедитесь, что вы возвращаете false своим слушателям, чтобы они не использовали событие. onClickListener потребляет его автоматически.

...