【问题标题】:Can't pass a string value to onItemClick?无法将字符串值传递给 onItemClick?
【发布时间】:2014-10-16 11:39:15
【问题描述】:

我正在解析 json 中的值并创建一个像这样的自定义列表视图 http://www.androidhive.info/2014/06/android-facebook-like-custom-listview-feed-using-volley/

我正在通过 json 传递一个 videoid,并且当列表项被选中时。我希望将 videoid 传递给 play 方法。 我该怎么做? 提前致谢!

public class VideoActivity extends Activity {

    private static final String TAG = "Mine";

    private static final int REQ_START_STANDALONE_PLAYER = 1;
    private static final int REQ_RESOLVE_SERVICE_MISSING = 2;

    public static final String DEVELOPER_KEY = "AIzaSyDcnoqJGI1KEVSZIMg872s";

    public ListView listView;
    private FeedListAdapter listAdapter;
    private List<FeedItem> feedItems;
    public String mvideoid;

    private String URL_FEED = "http://arulnadhan.hol.es/vid.json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_feed_list);
        listView = (ListView) findViewById(R.id.feed_list);
        feedItems = new ArrayList<FeedItem>();
        listAdapter = new FeedListAdapter(this, feedItems);
        listView.setAdapter(listAdapter);
         // making fresh volley request and getting json
        GsonRequest<FeedResult> gsonRequest = new GsonRequest<FeedResult>(URL_FEED, FeedResult.class,
                new Response.Listener<FeedResult>() {
                    @Override
                    public void onResponse(FeedResult response) {
                        feedItems = response.getFeedItems();
                        listAdapter.setData(feedItems);
                        listAdapter.notifyDataSetChanged();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d(TAG, "Error: " + error.getMessage());
                    }
                });


        // Adding request to volley request queue
        AppController.getInstance().addRequest(gsonRequest, TAG);
        getid();
    }


    /**
     * Parsing json reponse and passing the data to list adapter
     */
    private void parseJsonFeed(JSONObject response) {
        try {
            JSONArray feedArray = response.getJSONArray("feed");

            for (int i = 0; i < feedArray.length(); i++) {
                JSONObject feedObj = (JSONObject) feedArray.get(i);

                FeedItem item = new FeedItem();
                item.setId(feedObj.getInt("id"));
                String name = feedObj.isNull("name") ? null : feedObj
                        .getString("name");
                item.setName(name);

                // Image might be null sometimes
                String image = feedObj.isNull("image") ? null : feedObj
                        .getString("image");
                item.setImageUrl(image);
                item.setStatus(feedObj.getString("status"));

                // videoid might be null sometimes
                mvideoid = feedObj.isNull("videoid") ? null : feedObj
                        .getString("videoid");
                item.setVideoid(mvideoid);
                feedItems.add(item);
            }

            // notify data changes to list adapater
            listAdapter.notifyDataSetChanged();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }


public void getid(){
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                long arg3) {
            Log.d(TAG, Integer.toString(arg2));
            Log.d(TAG, mvideoid);
            play(mvideoid);

        }
    });
}

    public void play(String mvideoid){
        int startIndex = 0;
                int startTimeMillis = 0;
                boolean autoplay = true;
                boolean lightboxMode = false;
                Toast.makeText(VideoActivity.this, this.mvideoid, Toast.LENGTH_LONG).show();
                Intent intent = null;
                intent = YouTubeStandalonePlayer.createPlaylistIntent((Activity) getApplicationContext(), DEVELOPER_KEY,
                        mvideoid, startIndex, startTimeMillis, autoplay, lightboxMode);
                startActivity(intent);

                if (intent != null) {
                    if (canResolveIntent(intent)) {
                        startActivityForResult(intent, REQ_START_STANDALONE_PLAYER);
                    } else {
                        // Could not resolve the intent - must need to install or update the YouTube API service.
                        YouTubeInitializationResult.SERVICE_MISSING
                                .getErrorDialog((Activity) getApplicationContext(), REQ_RESOLVE_SERVICE_MISSING).show();
                    }
                }
    }

}

【问题讨论】:

    标签: android json listview onitemclicklistener


    【解决方案1】:

    在 onItemclick 中使用它并删除所有其他内容

    play(feedItems.get(arg2).getVideoid());
    

    编辑 1:

    (活动)getApplicationContext()

    用它代替 getApplicationContext()

    【讨论】:

    • 显示异常 java.lang.ClassCastException: io.bxbxbai.androiddemos.AppController 无法转换为 android.app.Activity
    • 错误是由于getApplicationContext()改成这个或者使用VideoActivity.this
    • 我仍然无法获得 id 吗?不知道为什么?
    【解决方案2】:

    你不是在对你的对象进行类型转换。

    试试下面的代码

    listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // TypeCast your clicked Object
            FeedItem item = (FeedItem) parent.getItemAtPosition(position);
            play(item.getVideoid());
        }
    });
    

    【讨论】:

    • 为什么不应该呢?鉴于 FeedItems 是来自适配器的项目,它肯定是因为我在各种应用程序中使用了类似的结构。
    • 您确定 AdapterView.getItemAtPosition(position) 在没有 TypeCasting 适配器的情况下返回“FeedItem”?
    【解决方案3】:

    这是我的答案@SilentKiller 的屏幕截图

    【讨论】:

      【解决方案4】:
            public void getid()
            {
              listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
                   {
                 @Override
                 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                  long arg3) {
                   Log.d(TAG, Integer.toString(arg2));
                   Log.d(TAG, mvideoid);
                   play(feedItems.get(arg2).getVideoid());
      
                   }
             });
        }
      

      【讨论】:

        【解决方案5】:

        如果 feeditems 是您的自定义对象类,请使用以下代码获取您的 videoid

         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                            long arg3) {
                        Log.d(TAG, Integer.toString(arg2));
                        Log.d(TAG, mvideoid);
        
                 feedItems feedItemslist= (feedItems ) arg0.getAdapter().getItem(arg2);
                    mvideoid=feedItemslist.getmvideoid();   
                  System.out.println(mvideoid.toString());
                  play(mvideoid);
        
        
                    }
                });
        

        :)

        【讨论】:

        • 请具体说明我在上面写的答案,您是否阅读了我发布的答案的第一行
        • 代码不应基于假设。因为你可以阅读有问题的代码。
        • 我现在可以证明我的代码不是假设它是一个工作代码
        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        相关资源
        最近更新 更多