2014-12-04 51 views
1

设置重点的EditText ListView中我检查了所有可能的解决方案来处理的EditText的焦点在ListView。 我有一个片段中的ListView。此ListView的适配器由ImageButton,ImageView和EditText组成。我想要EditText可调焦。 我尝试了一些解决方案,其中之一是:在片段

public class HomeFragment extends Fragment { 
    FileAdapter adapter; 
    ListView lv; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.fragment_home, container, false); 

     lv = (ListView)view.findViewById(R.id.listView); 
     adapter = new FileAdapter(getActivity().getApplicationContext(), list); 

     lv.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { 
       if (position == 1){ 
        lv.setItemsCanFocus(true); 

        lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 
        adapter.nome.requestFocus(); 
       }else{ 
        if (!lv.isFocused()){ 
         lv.setItemsCanFocus(false); 
         lv.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
         lv.requestFocus(); 
        } 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> adapterView) { 
       lv.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
      } 
     }); 
     lv.setAdapter(adapter); 

     return view; 
    } 
} 

然后在我的XML文件,我在ListView中有android:descendantFocusability="beforeDescendants"

这里是我FileAdapter类:

public class FileAdapter extends ArrayAdapter<Files> { 
    LayoutInflater inflater; 
    EditText nome; 
    private final Context context; 
    private ArrayList<Files> list;  

    public FileAdapter(Context context, ArrayList<Files> list) { 
     super(context, R.layout.homeadapter, list); 

     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 


     final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.homeadapter, null);  
     nome = (EditText) convertView.findViewById(R.id.tvNomeFile); 

     return convertView; 
    } 
} 

很明显,我把这里只有有用的部分我的代码,因为我说我的适配器也有其他的元素,但无用的问题之前。 我试过的解决方案不起作用,所以我正在寻找另一个。

+0

使用'的OnItemClick'代替'OnItemSelected' – kId 2014-12-04 09:01:13

+0

@kaushik它不工作 – 2014-12-04 09:04:31

+0

做ü需要什么'点击event'的行或者只有'ImageView'和'EditText'? – kId 2014-12-04 09:10:22

回答

0

昨天,我与我的片段类似的问题......这是我的片断代码:

public static class PlaceholderFragment_MainActivity extends Fragment implements View.OnClickListener { 

    //Declaration of classes 
    Floor_Adapter FloorsAdapter; 
    Floor_List Floors = new Floor_List(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //Declaration of controls 
     View view = inflater.inflate(R.layout.building_view, container, false); 
     TextView txtvHotelName = (TextView) view.findViewById(R.id.txtvHotelName); 
     ListView lvFloors = (ListView) view.findViewById(R.id.lvFloors); 


     txtvHotelName.setText("Hotel"); 
     Floors.setFloorsArray(); 
     FloorsAdapter = new Floor_Adapter(getActivity(),Floors.getFloorsArray(),lvFloors); 
     lvFloors.setAdapter(FloorsAdapter); 

     return view; 
    } 

    @Override 
    public void onClick(View view) { 
     String A; 
     TextView floor = (TextView)view.findViewById(R.id.txtvFloor); 
     A = floor.getText().toString(); 
    } 
} 

这我的适配器代码:

public class Floor_Adapter extends ArrayAdapter<Floor_Object>{ 
//Declaration of atributes 
private ArrayList<Floor_Object> Floor_List; 
private final Activity context; 
private final ListView lvFloors; 

public Floor_Adapter(Activity context,ArrayList<Floor_Object> Floors_Array,ListView lvFloors) { 
    super(context,R.layout.floor_layout,Floors_Array); 

    this.context = context; 
    this.Floor_List = Floors_Array; 
    this.lvFloors = lvFloors; 
} 

public static class Floor_View{ 

    //Declaration of Atributes 
    TextView FloorName; 
    Button btnFloorRow; 

    ImageView CheckImage; 
    TextView NoChecks; 

    ImageView BlockImage; 
    TextView NoBlocks; 

    ImageView DirtImage; 
    TextView NoDirts; 

    ImageView TroubleImage; 
    TextView NoTroubles; 

    ImageButton btnShowTasks; 
    ImageButton btnShowRooms; 
} 

@Override 
public View getView(int position, View ConvertView, ViewGroup parent) { 

    //Declaration of Variables 
    Floor_View rowView; 
    LayoutInflater inflator = context.getLayoutInflater(); 

    if(ConvertView == null){ 

     rowView = new Floor_View(); 
     ConvertView = inflator.inflate(R.layout.floor_layout,null,true); 

     rowView.FloorName = (TextView) ConvertView.findViewById(R.id.txtvFloor); 
     rowView.btnFloorRow = (Button) ConvertView.findViewById(R.id.btnFlooRow); 

     rowView.CheckImage = (ImageView) ConvertView.findViewById(R.id.ivCheck); 
     rowView.NoChecks = (TextView) ConvertView.findViewById(R.id.txtvCheckRooms); 

     rowView.BlockImage = (ImageView) ConvertView.findViewById(R.id.ivBlockRooms); 
     rowView.NoBlocks = (TextView) ConvertView.findViewById(R.id.txtvBlockedRooms); 

     rowView.DirtImage = (ImageView) ConvertView.findViewById(R.id.ivDirtRooms); 
     rowView.NoDirts = (TextView) ConvertView.findViewById(R.id.txtvDirtRooms); 

     rowView.TroubleImage = (ImageView) ConvertView.findViewById(R.id.ivTroubleRooms); 
     rowView.NoTroubles = (TextView) ConvertView.findViewById(R.id.txtvTroubleRooms); 

     rowView.btnShowTasks = (ImageButton) ConvertView.findViewById(R.id.btnShowTasks); 
     rowView.btnShowRooms = (ImageButton) ConvertView.findViewById(R.id.btnShowRooms); 


     ConvertView.setTag(rowView); 
    } 
    else 
    { 
     rowView = (Floor_View) ConvertView.getTag(); 
    } 

    Floor_Object Floor = Floor_List.get(position); 
    rowView.FloorName.setText(Floor.getFloorName()); 

    if(Floor.getNoChecks().equals("0")) { 
     rowView.CheckImage.setVisibility(View.INVISIBLE); 

     rowView.NoChecks.setVisibility(View.INVISIBLE); 
    } 
    else{ 
     rowView.CheckImage.setVisibility(View.VISIBLE); 

     rowView.NoChecks.setVisibility(View.VISIBLE); 
     rowView.NoChecks.setText(Floor.getNoChecks()); 
    } 

    if(Floor.getNoBlocks().equals("0")) { 
     rowView.BlockImage.setVisibility(View.INVISIBLE); 

     rowView.NoBlocks.setVisibility(View.INVISIBLE); 
    } 
    else{ 
     rowView.BlockImage.setVisibility(View.VISIBLE); 

     rowView.NoBlocks.setVisibility(View.VISIBLE); 
     rowView.NoBlocks.setText(Floor.getNoBlocks()); 
    } 

    if(Floor.getNoDirts().equals("0")) { 
     rowView.DirtImage.setVisibility(View.INVISIBLE); 

     rowView.NoDirts.setVisibility(View.INVISIBLE); 
    } 
    else{ 
     rowView.DirtImage.setVisibility(View.VISIBLE); 

     rowView.NoDirts.setVisibility(View.VISIBLE); 
     rowView.NoDirts.setText(Floor.getNoDirts()); 
    } 

    if(Floor.getNoTroubles().equals("0")) { 
     rowView.TroubleImage.setVisibility(View.INVISIBLE); 

     rowView.NoTroubles.setVisibility(View.INVISIBLE); 
    } 
    else{ 
     rowView.TroubleImage.setVisibility(View.VISIBLE); 

     rowView.NoTroubles.setVisibility(View.VISIBLE); 
     rowView.NoTroubles.setText(Floor.getNoTroubles()); 
    } 

    if(Floor.getNoBlocks().equals("0") && Floor.getNoDirts().equals("0") && Floor.getNoTroubles().equals("0")) { 
     rowView.btnFloorRow.setClickable(false); 

     rowView.btnShowTasks.setClickable(false); 
     rowView.btnShowTasks.setImageResource(R.drawable.list_999999_50); 
    } 
    else{ 
     rowView.btnFloorRow.setClickable(true); 
     rowView.btnFloorRow.setOnClickListener(OnShowTasksClickListener); 

     rowView.btnShowTasks.setClickable(true); 
     rowView.btnShowTasks.setOnClickListener(OnShowTasksClickListener); 
     rowView.btnShowTasks.setImageResource(R.drawable.list_3a4b66_50); 
    } 
    rowView.btnShowRooms.setOnClickListener(OnShowRoomsClickListener); 

    return ConvertView; 
} 

private View.OnClickListener OnShowTasksClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final int position = lvFloors.getPositionForView((View) v.getParent()); 
    } 
}; 

private View.OnClickListener OnShowRoomsClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     final int position = lvFloors.getPositionForView((View) v.getParent()); 
    } 
}; 
} 

你可以看到,当我与片段工作这是强制性的,以创建适配器控制事件......只是改变视事件,它是你的需求,我想......我在等待那样帮助你。如果您需要更多信息或帮助建议我,祝您好运!

PD:我觉得这是你的代码,你需要:

public class HomeFragment extends Fragment { 
FileAdapter adapter; 
ListView lv; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    final View view = inflater.inflate(R.layout.fragment_home, container, false); 

    lv = (ListView)view.findViewById(R.id.listView); 
    adapter = new FileAdapter(getActivity(), list); 
    lv.setAdapter(adapter); 

    return view; 
} 
} 


public class FileAdapter extends ArrayAdapter<Files> { 
private final Context context; 
private ArrayList<Files> list; 
private final ListView Lv;  

public FileAdapter(Context context, ArrayList<Files> list,ListView lv) { 
    super(context, R.layout.homeadapter, list); 

    this.context = context; 
    this.list = list; 
    this.Lv = lv; 
} 

public static class RowView{ 

//Declaration of Atributes 
EditText Nome; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    RowView rowView; 
    LayoutInflater inflator = context.getLayoutInflater(); 

    if(ConvertView == null){ 

     rowView = new RowView(); 
     convertView = inflator.inflate(R.layout.homeadapter, null); 

     rowView.nome = (EditText) convertView.findViewById(R.id.tvNomeFile); 
    } 

    rowView.nome.setOnItemSelectedListener(ItemSelecteListener); 

    return convertView; 
} 

private View.setOnItemSelectedListener ItemSelecteListener = new View.OnClickListener() { 
    @Override 
     public void onItemSelected(View view) { 

      final int position = lvFloors.getPositionForView((View) v.getParent()); 

      if (position == 1){ 
       lv.setItemsCanFocus(true); 

       lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 
      }else{ 
       if (!lv.isFocused()){ 
        lv.setItemsCanFocus(false); 
        lv.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
        lv.requestFocus(); 
       } 
      } 
     } 
}; 
} 
+0

我试图用这样的事情,但我认为(我不知道,我可以错),这不是我的情况确实非常有用。无论如何感谢您的尝试。 – 2014-12-04 09:35:41

+0

如果你想捕捉任何事件,这是你的解决方案! :D – 2014-12-04 09:37:43

+0

Fondesa在我的编辑帖子中看到PD并对我说!祝你好运! :d – 2014-12-04 10:11:41