Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
motoroller
2 / 2 / 1
Регистрация: 01.05.2012
Сообщений: 116
#1

Как добраться до объекта - Программирование Android

23.05.2015, 02:16. Просмотров 459. Ответов 3
Метки нет (Все метки)

В фрагменте установил слушателя по клику

Java
1
2
3
4
5
6
7
8
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
                    Log.v("My Project", String.valueOf(position));
 
                }
            });
Все работает, как получить внутри Item textView с id = body

Добавлено через 13 минут
Нашел: parent.findViewById(R.id.body).setVisibility(View.VISIBLE);

Добавлено через 3 минуты
Но осталась следующая проблема ...
по клику у меня почему-то появляются несколько textView.

Смысл у меня выводится несколько новостей, по клику на Item? хочу чтобы у этой новости покалось textView body
у которого свойто visible Gone
Так вот почему-то появляются еще тексты от других новостей

Добавлено через 26 минут
вывожу порядковый номер
Log.v("My Project", String.valueOf(position));

он показывает корректно, но открывает не всегда корректную новость а иногда сразу несколько скажите в чем может быть проблема?

Добавлено через 36 минут
Часто после нескольких кликов по новостям появляется ошибка:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

Добавлено через 3 минуты
Пытался обращаться так же:
parent.getChildAt(position).findViewById(R.id.body).setVisibility(View.VISIBLE);

Все равно то срабатывает потом нет и почему открывает не только дочернююий текст новости но и из других новостей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2015, 02:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как добраться до объекта (Программирование Android):

Как добраться до файлов на реальном устройстве - Программирование Android
Делаю проект в Эклипсе. Приложение запускаю на реальном устройстве. Как мне добраться до файлов моего приложения на реальном устройстве....

Как добраться до записей (notifications) в статус-баре - Программирование Android
Всем привет! Как воткнуть нотификацию в статус-бар c помощью NotificationManager ясно. Но появился вопрос: как получить перечень всех...

Как "добраться" до Linux? - Программирование Android
Здравствуйте. Как под Android &quot;залезть&quot;? Как получить доступ к ядру Linux? Где об этом написано? По AS на сайте много инфы, а про ядро...

Как получить значения margin у объекта - Программирование Android
Как получить значения margin у объекта? Например так задаю: RelativeLayout.LayoutParams LP_imageView = new...

Как определить, смотрим ли мы в сторону объекта? - Программирование Android
У нас есть координаты объекта (широта, долгота), координаты наши, девайс с компасом, направление на север. Как узнать, направлен ли девайс...

Можно ли для объекта определить оператор[] как в C# - Программирование Android
Можно ли для объекта определить оператор как в C# class S { private int array; public int this { return array; } }

3
Mikalai
256 / 232 / 94
Регистрация: 11.01.2015
Сообщений: 656
23.05.2015, 11:30 #2
Java
1
2
3
4
5
6
7
8
9
10
 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//если хочешь искать элементы в нажатом Вью его и используй
view.finViewById(R.id.....);
//Если нужно обратиться к другому элементу списка пиши
parent.getChildAt(position).findViewById(R.id.....).....
 
                }
            });
А если покажешь код и спросишь более конкретно, то вероятность подсказки увеличится в разы
0
motoroller
2 / 2 / 1
Регистрация: 01.05.2012
Сообщений: 116
23.05.2015, 16:29  [ТС] #3
NewsFragment.XML

здесь происходит вывод новостей, проблем с этим нет. Но почему-то по клику у меня появляется текст не только от текущей новости но и от других новостей

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package ru.animalface.app;
 
import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.Bundle;
 
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
 
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.util.ArrayList;
import java.util.List;
 
import ru.animalface.app.adapter.VolleyListAdapter;
import ru.animalface.app.model.News;
 
 
public class NewsFragment extends Fragment {
 
    private static List<News> newsList = new ArrayList<News>();
    private static ListView listView;
    private static VolleyListAdapter volleyAdapter;
 
    // Progress
    private ProgressDialog pDialog;
 
    public NewsFragment(){}
 
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
            View rootView = inflater.inflate(R.layout.fragment_news, container, false);
 
            // Load only one time when fragment is loading
            if (savedInstanceState == null) {
 
                pDialog = ProgressDialog.show(getActivity(), null, "Загрузка данных ...", true);
                listView = (ListView) rootView.findViewById(R.id.list);
                volleyAdapter = new VolleyListAdapter(getActivity(), newsList);
                listView.setAdapter(volleyAdapter);
                RequestQueue queue = Volley.newRequestQueue(getActivity());
 
                JsonArrayRequest newsReqest = new JsonArrayRequest("http://animalface.ru/mobile/news", new Response.Listener<JSONArray>() {
                            @Override
                            public void onResponse(JSONArray response) {
                                pDialog.hide();
                                // Parsing json
 
                                Log.v("My Project", String.valueOf(response.length()));
 
                                for (int i = 0; i < response.length(); i++) {
                                    try {
                                        JSONObject obj = response.getJSONObject(i);
                                        News news = new News();
                                        news.setTitle(obj.getString("title"));
                                        news.setImage(obj.getString("image"));
                                        news.setDate(obj.getString("datePrint"));
                                        news.setBody(obj.getString("body"));
                                        newsList.add(news);
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                                // notifying list adapter about data changes
                                // so that it renders the list view with updated data
                                volleyAdapter.notifyDataSetChanged();
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        pDialog.hide();
                        Log.v("My Project", error.getMessage());
                    }
                });
 
                // Adding request to request queue
                queue.add(newsReqest);
 
            // Load only data second or more times
            } else {
                listView = (ListView) rootView.findViewById(R.id.list);
                volleyAdapter = new VolleyListAdapter(getActivity(), newsList);
                listView.setAdapter(volleyAdapter);
            }
 
            // По клику новости
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.v("My Project", String.valueOf(position));
                    //Log.v("My Project", String.valueOf(id));
                    view.findViewById(R.id.body).setVisibility(View.VISIBLE);
                }
            });
 
            return rootView;
        }
}
VolleyListAdapter

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package ru.animalface.app.adapter;
 
import ru.animalface.app.R;
import ru.animalface.app.app.AppController;
import ru.animalface.app.model.News;
 
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.text.Html;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
 
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
 
public class VolleyListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<News> newsItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();
 
 
 
    public VolleyListAdapter(Activity activity, List<News> newsItems) {
        this.activity = activity;
        this.newsItems = newsItems;
    }
 
    @Override
    public int getCount() {
        return newsItems.size();
    }
 
    @Override
    public Object getItem(int location) {
        return newsItems.get(location);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.drawer_list_news, null);
 
        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.thumbnail);
 
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView date = (TextView) convertView.findViewById(R.id.date);
        TextView body = (TextView) convertView.findViewById(R.id.body);
 
        // getting news data for the row
        News n = newsItems.get(position);
 
        // thumbnail image
        thumbNail.setImageUrl(n.getImage(), imageLoader);
        
        // title
        title.setText(n.getTitle());
 
        // body
        body.setText(Html.fromHtml(n.getBody()));
 
        // date
        date.setText(n.getDate());
 
        return convertView;
    }
 
}
Модель новостей
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package ru.animalface.app.model;
 
public class News {
    private String title, image, date, body;
 
    public News() {}
 
    public News(String title, String image, String date, String body) {
        this.title = title;
        this.image = image;
        this.date = date;
        this.body = body;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getImage() {
        return image;
    }
 
    public void setImage(String image) {
        this.image = image;
    }
 
    public String getDate() {
        return date;
    }
 
    public void setDate(String date) {
        this.date = date;
    }
 
    public String getBody() {
        return body;
    }
 
    public void setBody(String body) {
        this.body = body;
    }
    
}
Вывод новостей

XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/news_bg" />
 
</RelativeLayout>
Вывод текущей новости

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/rl"
        android:padding="20dp">
 
        <!-- Image -->
        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/thumbnail"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="8dp"
            android:background="@drawable/news_image_border"/>
 
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_centerVertical="true">
 
            <!-- Title -->
            <TextView
                android:layout_marginLeft="100dp"
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15dp"
                android:textStyle="bold"
                android:textColor="@color/actionBar_backround"/>
 
            <!-- Date -->
            <TextView
                android:layout_marginLeft="100dp"
                android:id="@+id/date"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/title"
                android:layout_marginTop="1dip"
                android:textSize="14dp" />
 
            </RelativeLayout>
 
        </RelativeLayout>
 
    <!-- Body -->
    <TextView
        android:id="@+id/body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/rl"
        android:textColor="#000"
        android:textSize="16dp"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingBottom="20dp"
        android:visibility="gone" />
 
</RelativeLayout>
Вроде бы все просто, и самое сложное работает корректно, то есть новости запрашиваются и выводятся с картинками, при выводе я скрываю текст новости, по клику на новость хочу чтобы ТОЛЬКО у текущей показывался текс.

Добавлено через 33 минуты
За основу я брал этот пример: http://www.androidhive.info/2014/07/...-using-volley/

Код так же там там скачать можно
Так я взял пример и добавил обработчик нажатия

Java
1
2
3
4
5
6
7
listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                view.findViewById(R.id.title).setVisibility(View.GONE);
 
                Log.d("my_project", "itemClick: position = " + position + ", id = " + id);
            }
        });
Проблема аналогичная, я скрываю title а он скрывается сразу у нескольких объектов а не только у текущего

Добавлено через 25 минут
Подскажите может быть эта проблема в библиотеке?

Потому что попробовал другой пример: https://github.com/ogrebgr/android_volley_examples

Сделал аналогичный обработчик и так данные скрываются сразу у нескольких объектов.

Добавлено через 15 минут
Пробовал так же:

Log.v("My Project", String.valueOf(position));
parent.getChildAt(position).setVisibility(View.GONE);

В логах выводится номер верный, то есть 1,2,3...
А вот исчезают строки не те или больше чем надо
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,071
02.06.2015, 15:33 #4
Все очень просто:
1. Добавь в класс News поле boolean bodyVisible и пару методов:
Java
1
2
3
4
5
6
7
    public void setBodyVisible(boolean visible) {
        this.bodyVisible = visible;
    }
    
    public boolean getBodyVisible() {
        return bodyVisible;
    }
2. В методе getView класса VolleyListAdapter отображаем видимость объекта:
Java
1
body.setVisibility(n.getBodyVisible() ? TextView.VISIBLE : TextView.GONE);
3. В onItemClick класса NewsFragment управляем видимостью объекта:
Java
1
2
newsList.get(position).setBodyVisible(true);
volleyAdapter.notifyDataSetChanged();
А ежели надо по клику менять true|false то вот так вот:
Java
1
2
3
News n = newsList.get(position);
n.setBodyVisible(!n.getBodyVisible());
volleyAdapter.notifyDataSetChanged();
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2015, 15:33
Привет! Вот еще темы с ответами:

Как добраться до полей объекта? - Visual C++
Есть у меня такая проблема: Присутсвует вот такое объявление: class CMyDoc : public CDocument { protected: CMyDoc(); ...

Как добраться до канвы объекта - Delphi
Есть на панели StaticText. Как добраться до канвы этого объекта, чтобы изменить фон, например.

как добраться к данным объекта? - JavaScript
получаю данные через сокет в dat. var dat = socket.on('realtimeinfo', function (data) {console.log(data); } ); лог в консоле...

Как добраться до пиксилей ? - Графика и игры
Есть изображение , и мне его по сути надо перегнать в массив для сканировки. В какую сторону гуглить???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
02.06.2015, 15:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru