在Android中,一次只单击一行ListView
我的应用程序中有一个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
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方法。