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

在Android中,一次只单击一行ListView,android,listview,adapter,Android,Listview,Adapter,我的应用程序中有一个ListView。 下面是我的主要活动 public class MainActivity extends Activity{ ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Stri

我的应用程序中有一个ListView。 下面是我的主要活动

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);
  }
}
在我的adapter类中,我创建了两个LinearLayout,在一个布局中有四个按钮,其中包含我从主活动传递的随机数据Am、I、Good、Girl,另一个布局正好位于上述布局的下方,具有相同数量的按钮,并将这些布局放在父相对布局中,以便绘制单行。现在,当我双击上面的布局按钮时,数据将与rightOrder字符串[]进行比较,我将该字符串从MainActivity传递到适配器,并选择合适的位置。一切正常,但我的任务是第一次第一行的按钮可点击,其他行未聚焦,当我执行第一行任务时,第二行的按钮聚焦,第一行和其他行未聚焦。我的适配器类是

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;
    }

  }
 }

我以编程方式创建了布局,没有充气。

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

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  
list.getSelectedItemPosition();  
然后,您可以按如下方式获取所选项目的位置:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  
list.getSelectedItemPosition();  
更新:


重写适配器的isEnabled int position方法。跟踪启用的位置。任何其他位置都会导致此方法返回false。

实际上,我希望在启动应用程序时,第一行是可单击的,其他行是禁用的,当我对第一行执行完整操作时,控制传递到第二行,第一行和除第二行之外的其余行是禁用的。如果你可以发布代码,这将是很大的帮助。我已经这样做了,但我没有得到正确的结果。请张贴的实施以及。谢谢还有一件事,当我执行第一行任务时,第二行将启用,然后是如何使用isEnabled方法。