2017-09-23 77 views
0

我有一個特定的問題。我正在創建一個應用程序,它允許我顯示某些菜餚的菜單。我設計了一個包含TextView和RatingBar的自定義適配器。所以在我的其他Activity(ViewDatabase)中,我從JSON-File(方法名爲showData)中檢索碟名,並將其顯示在獲取自定義適配器的ListView中。Android - 如何處理單個ListViewItem中的多個元素?

我現在的問題是,不知道爲什麼我只能選擇我的菜的名稱(所以我的適配器的textview)或評級欄(也在我的適配器)。

我試圖把方法:myListView.setItemsCanFocus(true);但仍然沒有工作。

我沒有實現一個clicklistener我的文本在適配器?我試圖實現one.I需要一個明確的意圖交換活動,但我不能 從一個Adapterclass轉到其他類的意圖。

在ViewDatabse-類是onItemClick我改變活動如果我點擊文本的方法。

這裏是我的代碼:

  • 適配器:

一)

public UserInformationAdapter(Context context, List<UserInformation> objects) { 
    super(context, R.layout.rating_item, objects); 
    this.context = context; 
    table = objects; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.rating_item, null); 
    } 

    TextView name = (TextView) v.findViewById(R.id.hauptgerichte); 
    RatingBar ratingBar = (RatingBar) v.findViewById(R.id.rate_bar); 

    UserInformation userInformation = table.get(position); 


    ratingBar.setOnRatingBarChangeListener(onRatingChangedListener(position)); 

    ratingBar.setTag(position); 
    ratingBar.setRating(getItem(position).getRatingStar()); 

    name.setText(userInformation.getName()); 

    name.setTag(position); 
    return v; 
} 

private RatingBar.OnRatingBarChangeListener onRatingChangedListener(final int position) { 
    return new RatingBar.OnRatingBarChangeListener() { 
     @Override 
     public void onRatingChanged(RatingBar ratingBar, float v, boolean b) { 
      UserInformation item = getItem(position); 
      assert item != null; 
      item.setRatingStar(v); 
      Log.i("Adapter", "star: " + v); 
     } 
    }; 
} 

}

這是項目(名稱和的RatingBar):

公共類UserInformation {

private String name; 
private float ratingStar; 


public UserInformation(){ 

} 

public String getName() { 
    return name; 
} 


public void setName(String name) { 
    this.name = name; 
} 

void setRatingStar(float ratingStar) { 
    this.ratingStar = ratingStar; 
} 

float getRatingStar() { 
    return 0; 
} 


    @Override 
public String toString(){ 
    return name; 
} 

}

這是檢索名稱的活動:

  • 活動:

公共類ViewDatabase延伸AppCompatActivity {

private static final String TAG = "ViewDatabase"; 
private FirebaseDatabase mFirebaseDatabase; 
private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 
private DatabaseReference myRef; 
private String userID; 
private ArrayList<String> array; 

private final List<UserInformation> arr = new ArrayList<>(); 
private UserInformationAdapter adapter2; 

private ListView mListView; 




@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_database_layout); 

    array = new ArrayList<>(); 
    mListView = (ListView) findViewById(R.id.list_karnivoure); 
    mListView.setItemsCanFocus(true); 


    mAuth = FirebaseAuth.getInstance(); 
    mFirebaseDatabase = FirebaseDatabase.getInstance(); 
    myRef = mFirebaseDatabase.getReference(); 


    FirebaseUser user = mAuth.getCurrentUser(); 
    userID = user.getUid(); 





    myRef.child("shakes").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 
      showData(dataSnapshot); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

private void showData(DataSnapshot dataSnapshot) { 

    Iterable<DataSnapshot> children = dataSnapshot.getChildren(); 

    for (DataSnapshot child: children){ 

     UserInformation uInfo = child.getValue(UserInformation.class); 
     arr.add(uInfo); 

     adapter2 = new UserInformationAdapter(ViewDatabase.this, arr); 

     mListView.setAdapter(adapter2); 
     mListView.setItemsCanFocus(true); 

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       mListView.setItemsCanFocus(true); 
       Object listItem = mListView.getItemAtPosition(position); 
       Intent i = new Intent(ViewDatabase.this,KarnivoureInput.class); 
       i.putExtra("name", listItem.toString()); 
       startActivity(i); 
      } 
     }); 

    } 

回答

0

https://stackoverflow.com/a/8955441/5608931

嘗試添加該attribue到TextViewRatingBar。這將是可點擊的,但不會得到專注

android:focusable="false" 
+0

這個dowsnt爲我工作。我想主要的問題是我沒有一個點擊偵聽器在我的適配器textView。我不知道如何爲textView完全添加一個。我在ViewDatabase類中實現了一個Click Listener,該類中包含「onItemClick」,它爲我提供了整個項目的clicklsitener。這個「onItemClick」返回列表視圖中的菜名,並將其提供給另一個活動。我怎麼能在customAdapter中實現這個意圖? –

相關問題