2015-03-11 3 views
-3

У меня есть ListView в моем приложении. Ниже мой MainActivityНажмите только одну строку ListView за один раз в Android

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», «Я», «Хорошо», «Девочка», который я прохожу от Основная активность и другая компоновка чуть ниже указанной компоновки с таким же количеством кнопок, и поместите их в родительский. Относительный макет для рисования одной строки. Теперь, когда я дважды нажимаю на кнопку над макетом, тогда данные сравниваются с 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

Что вы спрашиваете, неясно, но угадывая вопрос, вы хотите установить режим выбора для ListView? Если вы хотите, чтобы пользователь выбрать только один пункт в то время, вы можете сделать это следующим образом:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Вы можете получить позицию выбранного элемента следующим образом:

list.getSelectedItemPosition(); 

Update :

Переопределите метод вашего адаптера isEnabled (int position). Следите за тем, какая позиция включена. Любые другие позиции приведут к тому, что этот метод вернет false.

+0

На самом деле я хочу, чтобы при запуске приложения первая строка была нажата, а другие строки отключены, и когда я выполняю полную операцию с первой строкой, тогда управление переходит ко второй строке, а первая строка и остальные строки отключены, за исключением второго. Если вы также можете опубликовать код, это будет большой помощью. – yenu

+0

@yenu Посмотрите на обновление –

+0

Я уже делаю это, но я не получаю правильный результат. Просьба также опубликовать эту информацию. Благодарю. И еще одна вещь, когда я выполняю задачу первой строки, а затем вторую строку, то как используется метод isEnabled. – yenu

Смежные вопросы