список проверяемых Android - PullRequest
6 голосов
/ 09 мая 2011

Я новичок в разработке приложений для Android. Я создал свой собственный адаптер списка, как показано ниже, и хочу, чтобы этот список можно было проверить. Что мне нужно сделать, чтобы в моем списке был флажок для каждой строки?

public class listAvtivity extends ListActivity {
private LayoutInflater mInflater;
private Vector<RowData> data;
RowData rd;
static final String[] title = new String[] {
        "*New*Apple iPad Wi-Fi (16GB)", "7 Touch Tablet -2GB Google Android",
"Apple iPad Wi-Fi (16GB) Rarely Used ","Apple iPad Wi-Fi (16GB) AppleCase"      };
static final String[] detail = new String[] {
        "1h 37m Shipping: $10.00","1h 39m Shipping: Free","58m 6s Shipping:$10.00","59m 30s Shipping: $10.95"   };
//private Integer[] imgid = {
 // R.drawable.bsfimg,R.drawable.bsfimg4,R.drawable.bsfimg2,
 // R.drawable.bsfimg5
//};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mInflater = (LayoutInflater) getSystemService(
Activity.LAYOUT_INFLATER_SERVICE);
data = new Vector<RowData>();
for(int i=0;i<title.length;i++){
try {
    rd = new RowData(i,title[i],detail[i]);
    } catch (ParseException e) {
        e.printStackTrace();
   }
   data.add(rd);
}
   CustomAdapter adapter = new CustomAdapter(this, R.layout.list,
                                     R.id.title, data);
   setListAdapter(adapter);
   getListView().setTextFilterEnabled(true);
}
   public void onListItemClick(ListView parent, View v, int position,
                                                                long id) {
   Toast.makeText(getApplicationContext(), "You have selected "
                    +(position+1)+"th item",  Toast.LENGTH_SHORT).show();
}
       private class RowData {
       protected int mId;
       protected String mTitle;
       protected String mDetail;
       RowData(int id,String title,String detail){
       mId=id;
       mTitle = title;
       mDetail=detail;
    }
       @Override
       public String toString() {
               return mId+" "+mTitle+" "+mDetail;
       }
}
  private class CustomAdapter extends ArrayAdapter<RowData> {
  public CustomAdapter(Context context, int resource,
                        int textViewResourceId, List<RowData> objects) {
 super(context, resource, textViewResourceId, objects);
}
      @Override
       public View getView(int position, View convertView, ViewGroup parent) {
       ViewHolder holder = null;
       TextView title = null;
       TextView detail = null;
       //ImageView i11=null;
       RowData rowData= getItem(position);
       if(null == convertView){
            convertView = mInflater.inflate(R.layout.list, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
 }
             holder = (ViewHolder) convertView.getTag();
             title = holder.gettitle();
             itle.setText(rowData.mTitle);
             detail = holder.getdetail();
             detail.setText(rowData.mDetail);
             //i11=holder.getImage();
             //i11.setImageResource(imgid[rowData.mId]);
             return convertView;
}
            private class ViewHolder {
            private View mRow;
            private TextView title = null;
            private TextView detail = null;
            //private ImageView i11=null;
            public ViewHolder(View row) {
            mRow = row;
 }
         public TextView gettitle() {
             if(null == title){
                 title = (TextView) mRow.findViewById(R.id.title);
                }
            return title;
         }
         public TextView getdetail() {
             if(null == detail){
                  detail = (TextView) mRow.findViewById(R.id.detail);
                    }
           return detail;
         }
        //public ImageView getImage() {
          //   if(null == i11){
            //      i11 = (ImageView) mRow.findViewById(R.id.img);
              //                        }
                //return i11;
        //}
     }
   } 
}

Ответы [ 2 ]

8 голосов
/ 28 декабря 2013

Мне понравилось решение Карлоса Сессы из его книги "50 взломов Android".

my activity_fabilities.xml выглядит следующим образом:

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

    <ListView
        android:id="@+id/favContainer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:choiceMode="singleChoice"/>

</RelativeLayout>

My FavoritesActivity.java выглядит следующим образом:

package com.myproject;

import java.util.ArrayList;

import com.myproject.R;
import com.myproject.model.Package;
import com.myproject.adapter.FavoritesPackageArrayAdapter;
import com.myproject.utils.DatabaseHelper;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.ListView;

public class FavoritesActivity extends Activity
{
    protected ListView list;
    protected String selectedPackage;
    protected ArrayList<Package> packages;
    protected FavoritesPackageArrayAdapter adapter;

    private DatabaseHelper db = new DatabaseHelper(this);

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_favorites);

        packages = db.getPackages();
        adapter = new FavoritesPackageArrayAdapter(this, -1, packages);
        list = (ListView) findViewById(R.id.favContainer);
        list.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onSelect(View view)
    {
        int pos = list.getCheckedItemPosition();
        if(ListView.INVALID_POSITION != pos)
            selectedPackage = packages.get(pos).getId();
    }

}

Мой адаптер ListView (FavoritesPackageArrayAdapter.java) довольно прост:

package com.myproject.adapter;

import java.util.List;

import com.myproject.model.Package;
import com.myproject.view.PackageView;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;

public class FavoritesPackageArrayAdapter extends ArrayAdapter<Package>
{

    public FavoritesPackageArrayAdapter(Context context, int resource, List<Package> objects)
    {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if(convertView == null)
            convertView = new PackageView(getContext());

        Package pack = getItem(position);
        PackageView packView = (PackageView) convertView;
        packView.setPackage(pack);

        return convertView;
    }

}

Чтобы элементы списка можно было проверять, в вашем представлении должен быть реализован интерфейс Checkable.Мой PackageView.java выглядит следующим образом:

package com.myproject.view;

import java.util.ArrayList;

import com.myproject.R;
import com.myproject.model.Package;
import com.myproject.model.PackageEvent;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Checkable;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.CheckBox;

public class PackageView extends LinearLayout implements Checkable
{
    private View v;
    private TextView tv0;
    private TextView tv1;
    private TextView tv2;
    private TextView tv3;

    private CheckBox testCheckBox;

    public PackageView(Context context)
    {
        super(context);
        LayoutInflater inflater = LayoutInflater.from(context);
        v = inflater.inflate(R.layout.favorites_package, this, true);
        tv0 = (TextView) v.findViewById(R.id.favPackageId);
        tv1 = (TextView) v.findViewById(R.id.favEventDate);
        tv2 = (TextView) v.findViewById(R.id.favEventAddres);
        tv3 = (TextView) v.findViewById(R.id.favEventState);

        // I don't have checkbox in my layout, but if I had:
        // testCheckBox = (CheckBox) v.findViewById(R.id.checkBoxId);
    }

    public void setPackage(Package pack)
    {
        // my custom method where I set package id, date, and time 
        ...
    }

    private Boolean checked = false;

    @Override
    public boolean isChecked()
    {
        return checked;
        // if I had checkbox in my layout I could
        // return testCheckBox.checked();
    }

    @Override
    public void setChecked(boolean checked)
    {
        this.checked = checked;

        // since I choose not to have check box in my layout, I change background color
        // according to checked state
        if(isChecked())
            ...
        else
            ...
        // if I had checkbox in my layout I could
        // testCheckBox.setChecked(checked);
    }

    @Override
    public void toggle()
    {
        checked = !checked;
        // if I had checkbox in my layout I could
        // return testCheckBox.toggle();
    }

}

И, наконец, XML-макет каждого элемента списка (Favorites_package.xml):

<?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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/favPackageId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <LinearLayout
        android:id="@+id/favTimeDateContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="1">

        <TextView
            android:id="@+id/favEventDate"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"/>

        <TextView
            android:id="@+id/favEventAddres"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"/>
    </LinearLayout>


   <TextView
       android:id="@+id/favEventState"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"/>

</LinearLayout>

Если вы хотите, чтобы в вашем макете был установлен настоящий флажокXML должен выглядеть примерно так:

<CheckBox
       android:id="@+id/checkBoxId"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:clickable="false"
       android:focusable="false"
       android:focusableInTouchMode="false"/>

Если вы оставили флажок активируемым, вы можете проверить его, только нажав на сам флажок.Также не делайте ваш макет кликабельным, по некоторым причинам он не работает с интерфейсом Checkable.

0 голосов
/ 09 мая 2011

Посмотрите на этот пример кода

http://www.androidpeople.com/android-listview-multiple-choice-example

--- Редактировать -

Вы не разместили свои XML-файлы. Чтобы иметь произвольную строку списка, я сделал это так. Сначала я устанавливаю viewcontentview, который содержит мой listview в вашем коде Java.

setContentView(R.layout.list_main);

Тогда ваш файл list_main.xml должен содержать просмотр списка

<ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

После установки данных адаптер

  setListAdapter(new YOUR_ADAPTER_CLASS(this, R.layout.list_item, YOUR_OBJECT));

Чтобы получить пользовательский элемент списка, создайте файл list_item.xml, содержащий вашу пользовательскую строку. Здесь вы можете разместить линейные макеты, изображения или флажки.

Тогда получите список

  ListView listView = getListView();

Вы можете установить прослушиватель onitemclick здесь

listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
             //YOUR_CODE_HERE
        }
      });

Затем в вашем файле адаптера вы можете реализовать функцию getview

@Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
            View view = convertView;
            if (view == null) {
                LayoutInflater layoutInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = layoutInflator.inflate(R.layout.list_item, null);
            }
            //YOU CAN GET EVERY OBJECT AND SET YOUR CUSTOM ROW like below
            //view.findViewById(R.id.YOUR_OBJECT_ID_HERE);
            return view;
    }

Я не мог посмотреть на ваш код и сказать, что не так, но это правильный способ реализации пользовательских строк для списка в Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...