在Android中一次只能单击一行ListView

时间:2015-03-11 05:28:48

标签: android listview adapter

我的应用程序中有一个ListView。 以下是我的MainActivity

public class MainActivity extends Activity{
 ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String[] wrongOrder = new String[] {"Am/I/Girl/Good","Ila/Is/Name/My","Barking/Dog/Is"};
    String[] rightOrder = new String[]{"I/Am/Good/Girl","My/Name/Is/Ila","Dog/Is/Barking"};

     DashboardListAdapter codeLearnArrayAdapter = new DashboardListAdapter(this,0, wrongOrder,rightOrder);// new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, codeLearnChapters);

      listView = (ListView)findViewById(R.id.listView1);
     listView.setAdapter(codeLearnArrayAdapter);
  }
}

在我的适配器类中,我创建了两个LinearLayout,在一个布局中有四个按钮,其中随机数据为“Am”,“I”,“Good”,“Girl”,我从Main Activity传递,另一个布局在上面布局具有相同数量的按钮,并将这些布局放在父相对布局中以绘制单行。现在,当我双击上面的布局按钮,然后数据与rightOrder String []进行比较,我将其从MainActivity传递到Adapter并采取合适的位置。一切正常,但我的任务是第一次第一行的按钮是可点击的,其他行没有聚焦,当我执行第一行任务时,第二行的按钮聚焦,第一行和其他行没有聚焦。我的适配器类是

public class DashboardListAdapter extends ArrayAdapter<String>{
Button clickedBtn;
private int mLayout;
private Activity mContext;
private String[] listArray;
String[] rightArray;

Button[][] btnArray;
int[] indexArray;
private int mLastPosition = -1;

static int id = 1000;
static int id1 = 5000;
LinearLayout innerLayout2;
LinearLayout innerLayout1;

static int innerLayoutTag = 778;
static boolean flag = false;



public DashboardListAdapter(Activity context, int resource,
        String[] lsitArray,String[] rightArray) {
    super(context, resource);
    this.mContext = context;
    this.listArray = lsitArray;
    this.rightArray = rightArray;
    this.btnArray = new Button[listArray.length][];
    this.indexArray = new int[listArray.length];


    this.setLayout(resource);
}


@Override
public int getCount() 
{
    return listArray.length;
}


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

/**
 * @return the layout
 */
public int getLayout() 
{
    return mLayout;
}

/**
 * @param layout
 *            the layout to set
 */
public void setLayout(int layout) 
{
    this.mLayout = layout;
}

/**
 * @return the context
 */
public Activity getContext() 
{
    return mContext;
}

/**
 * @param context
 *            the context to set
 */
public void setContext(Activity context) 
{
    this.mContext = context;
}

public View getView(int position, View convertView, ViewGroup parent)
{
    if (convertView == null) {
        RelativeLayout layout = new RelativeLayout(mContext);              
        String content = null;
        content = listArray[position];
        List<String> list = new ArrayList<String>(Arrays.asList(content.split("/")));

        innerLayout1 = new LinearLayout(mContext);
        innerLayout1.setId(100);
        innerLayout2 = new LinearLayout(mContext);
        Button[] rowBtnArray = new Button[list.size()];
        for(int i=0; i<list.size(); i++)
        {
            Button   btn = new Button(mContext);
            LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            btn.setLayoutParams(p);
            btn.setText(list.get(i));
            btn.setId(id++);
            btn.setTag(i);
            innerLayout1.addView(btn);
            innerLayout1.setTag(position);
            Button btnNew = new Button(mContext);
            RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            btnNew.setLayoutParams(p1);
            btnNew.setText("hello");
            btnNew.setId(id1++);
            innerLayout2.addView(btnNew);
            rowBtnArray[i] = btnNew;
            btn.setOnTouchListener(new OnTouchListener() {
                @SuppressWarnings("deprecation")
                GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector(mContext));
                @Override
                public boolean onTouch(View v, MotionEvent event) { 
                    clickedBtn = (Button)v;

                    return gestureDetector.onTouchEvent(event);

                }
            });


        }

        btnArray[position] = rowBtnArray;
        RelativeLayout.LayoutParams p1 = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        p1.addRule(RelativeLayout.BELOW,innerLayout1.getId());
        innerLayout2.setLayoutParams(p1);
        innerLayout2.setTag(innerLayoutTag);
        layout.addView(innerLayout1);

        layout.addView(innerLayout2);

        convertView = layout; //INSTEAD OF INFLATING A LAYOUT FOR THE ROW I JUST BINDED IT TO THE RECENTLY CREATED LAYOUT 
    } 
    else 
    {

    }
    return convertView;

}

public class MyGestureDetector extends SimpleOnGestureListener {
    public Context context;
    public String phno;

    public MyGestureDetector(Context con)
    {
        this.context=con;       
    }
    @Override
    public boolean onDown(MotionEvent e) {
        return super.onDown(e);
    }

    @Override
    public boolean onDoubleTap(MotionEvent e) {
        System.out.println("in Double tap");
        String str = (String) clickedBtn.getText();
        LinearLayout rowLayout = (LinearLayout)clickedBtn.getParent();
        int rowNum = (int) rowLayout.getTag();
        String content = rightArray[rowNum];
        List<String> list = new ArrayList<String>(Arrays.asList(content.split("/")));
        Button[]  rowBtn = btnArray[rowNum];

        for(int j=0; j<list.size(); j++)
        {
            String text = list.get(j);
            if(text.equalsIgnoreCase(str))
            {
                int index = indexArray[rowNum];
                if(index == j)
                {
                    Button btn = rowBtn[j];
                    btn.setVisibility(View.VISIBLE);
                    btn.setText(str);
                    index+=1;
                    indexArray[rowNum] = index;
                }
                else
                {
                    Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
                    vibrator.vibrate(400);
                }

            }
        }
        return true;
    }

  }
 }

我以编程方式创建了布局而没有膨胀。

1 个答案:

答案 0 :(得分:0)

你问的是不清楚但是从问题中猜测,你想为ListView设置选择模式吗?如果您希望用户一次只选择一个项目,可以按如下方式执行此操作:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  

然后您可以按如下方式获取所选项目的位置:

list.getSelectedItemPosition();  

更新:

覆盖适配器的isEnabled (int position)方法。跟踪启用的位置。任何其他位置都将导致此方法返回false。