我的应用程序中有一个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;
}
}
}
我以编程方式创建了布局而没有膨胀。
答案 0 :(得分:0)
你问的是不清楚但是从问题中猜测,你想为ListView
设置选择模式吗?如果您希望用户一次只选择一个项目,可以按如下方式执行此操作:
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
然后您可以按如下方式获取所选项目的位置:
list.getSelectedItemPosition();
更新:
覆盖适配器的isEnabled (int position)
方法。跟踪启用的位置。任何其他位置都将导致此方法返回false。