【问题标题】:Updated: Getting a Toast for a ListView with Images on Android App更新:在 Android 应用上为带有图像的 ListView 祝酒
【发布时间】:2017-02-20 23:05:21
【问题描述】:

对于以下内容,我添加了以下 toast:

public void Toast (View v) {
    Toast.makeText(this, "Test", Toast.LENGTH_LONG).show();
}

它可以工作,但显然它所做的只是为所有内容显示“测试”。我以为我可以做 'this.dogTitles' 或 'this.dogDescriptions' 但它不会让我这样做。

有人能解释一下原因吗?我已经把它放在 onCreate 方法中了。

谢谢

每当单击列表项(行)时,我都无法确定如何对 Toast 进行编程。

我可以为简单的程序做祝酒词,但由于数组适配器,我很难解决这样的问题。

我的代码如下。

提前致谢。

package lab.mad.cct.c3375331task2;

import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class Task2Activity extends AppCompatActivity {

ListView list;
String [] dogTitles;
String [] dogDescriptions;
int[] images = {R.drawable.husky, R.drawable.pug, R.drawable.yorkshire_terrier, R.drawable.french_bulldog,
R.drawable.border_collie, R.drawable.great_dane, R.drawable.staffordshire_bull_terrier, R.drawable.golden_retriever,
R.drawable.german_shepherd, R.drawable.doberman};

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

    Resources res = getResources();
    dogTitles = res.getStringArray(R.array.titles);
    dogDescriptions = res.getStringArray(R.array.descriptions);

    list = (ListView) findViewById(R.id.listView);
    dogAdapter adapter = new dogAdapter(this, dogTitles, images, dogDescriptions);
    list.setAdapter(adapter);
}
}

class dogAdapter extends ArrayAdapter<String>
{
    Context context;
int[] images;
String[] titleArray;
String[] descriptionArray;
dogAdapter(Context c, String[] titles, int imgs[], String[] desc)
{
    super(c, R.layout.single_row, R.id.largeText, titles);
    this.context = c;
    this.images = imgs;
    this.titleArray = titles;
    this.descriptionArray = desc;
}

class MyViewHolder
{
    ImageView myImage;
    TextView myTitle;
    TextView myDescription;
    MyViewHolder(View v)
    {
        myImage = (ImageView) v.findViewById(R.id.imageView);
        myTitle = (TextView) v.findViewById(R.id.largeText);
        myDescription = (TextView) v.findViewById(R.id.smallText);
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    MyViewHolder holder = null;
    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.single_row, parent, false);
        holder = new MyViewHolder(row);
        row.setTag(holder);
        Log.d("dogs", "Creating a new row");
            }
    else {
        holder = (MyViewHolder) row.getTag();
        Log.d("dogs", "Recycling stuff");
    }
    //ImageView myImage = (ImageView) row.findViewById(R.id.imageView);
    //TextView myTitle = (TextView) row.findViewById(R.id.largeText);
    //TextView myDescription = (TextView) row.findViewById(R.id.smallText);

    holder.myImage.setImageResource(images[position]);
    holder.myTitle.setText(titleArray[position]);
    holder.myDescription.setText(descriptionArray[position]);

    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast toast = new Toast(getContext());
            toast.setDuration(Toast.LENGTH_LONG);
            toast.show();
        }
    });

    return row;
}
}

【问题讨论】:

  • this 引用当前对象并根据调用位置更改它所引用的内容。我已经更新了我的答案,以展示如何从数组中获取值,但如果需要,你也可以从适配器中获取值。

标签: android listview android-arrayadapter android-toast


【解决方案1】:

您可以通过在 ArrayAdapter 的 getView() 方法中执行以下操作来专门处理每行敬酒

row.setOnClicklistener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
      //display toast here  
   }
});

【讨论】:

    【解决方案2】:

    在设置适配器后的 onCreate 中,在列表之后放置一个 OnClickListener。

    list.setOnClickListener
    

    然后像往常一样在 onClick 中添加一个 Toast。

    如果您想从行中的特定小部件中获取它,请使用与列表相同的小部件。不过,请在适配器中执行此操作。在您的 holder.myDescription.setText 之后执行此操作

    textView.setOnClickListener
    

    在它的 onCreate 上放置你的吐司。

    【讨论】:

    • 虽然@AdamGardner,但我认为事情没有那么简单。我希望它能够单击行上的任意位置以获取吐司。通过按照我知道的方式进行操作,我将不得不使用其中一个文本框或图像。我该怎么做?
    • 是的,@PhilAdams。如果需要,您可以将 OnClickListener 设置为构成您的行的行、列表或单个小部件。
    【解决方案3】:
    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context, ""+position, Toast.LENGTH_SHORT).show();
        }
    });
    

    【讨论】:

      【解决方案4】:

      您尚未将任何视图分配给 Toast 您的点击有效,但未显示 Toast。 显示吐司的简单方法

      Toast.makeText(this, "Android Simple Toast", Toast.LENGTH_LONG).show();
      

      根据您的代码,您必须设置一个视图来像这样吐司 toast.xml

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/toast_layout_root"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="10dp"
      android:background="#DAAA" >
      
      <TextView android:id="@+id/text"
          android:layout_width="wrap_content"
          android:layout_height="fill_parent"
          android:textColor="#FFF" />
      

      然后在你的点击中

      LayoutInflater inflater = getLayoutInflater();
      View layout = inflater.inflate(R.layout.toast_layout,
                                     (ViewGroup) findViewById(R.id.toast_layout_root));
      TextView text = (TextView) layout.findViewById(R.id.text);
      text.setText("Hello! This is a custom toast!");
      
      Toast toast = new Toast(getApplicationContext());
      toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
      toast.setDuration(Toast.LENGTH_LONG);
      toast.setView(layout);//this you missed
      toast.show();
      

      【讨论】:

        【解决方案5】:

        在你的 onCreate 中添加一个OnItemClickListener 到你的ListViewOnIemClickListener 内置在 ListView 中,以提供与 ListView 中每个行项的单击交互。

        在你的onCreate

        list = (ListView) findViewById(R.id.listView);
        dogAdapter adapter = new dogAdapter(this, dogTitles, images, dogDescriptions);
        list.setAdapter(adapter);
        
        list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        
                // Use the clicked item's position to get the corresponding values
                // from arrays, adapter, etc.
                Toast.makeText(getContext(), dogTitles[position] + " " + dogDescriptions[position], Toast.LENGTH_LONG)
                       .show();
            }
        }); 
        

        【讨论】:

        • 我已经尝试了好几件事但无济于事,我很难理解该放在哪里
        • @PhilAdams Place list.setOnItemClickListener()list.setAdapter() 之后
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        相关资源
        最近更新 更多