Пользовательский список не отображается до тех пор, пока не будет выбран текст редактирования и появится клавиатура - PullRequest
0 голосов
/ 10 октября 2018

Итак, у меня очень странная проблема, у меня есть действие, которое показывает сообщения и дату пользователя в ListView с помощью Custom ListView, получает их с сервера и заполняет их на onCreate .

так выглядит интерфейс действия enter image description here

, поэтому каждый раз, когда язапустите действие, когда выбирается часть edittext, и, как правило, клавиатура появляется

Я гуглил, как не фокусировать EditText при запуске, найдя, добавив эти две строкив родительском макете фокус на EditText может быть предотвращен

android:focusable="true" 
android:focusableInTouchMode="true"

, поэтому я добавил, что к XML-документу RelativeLayout это xml изображения выше

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/verticalLinear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    tools:context=".UserHome">

    <EditText
        android:id="@+id/tweetText"
        android:layout_width="match_parent"
        android:layout_height="122dp"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:hint="Write Your Tweet"
        android:inputType="textPersonName" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/userListHome"
        android:layout_alignParentEnd="true"
        android:onClick="postTweetFunction"
        android:text="Post" />


    <ListView
        android:id="@+id/userListHome"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/tweetText"
        android:focusable="true"
        android:focusableInTouchMode="true"/>


</RelativeLayout>

Теперь о проблемной части, которую мне нужно было сказать выше, чтобы вы поняли, в чем проблема, именно потому, что она странная.

, поэтому просмотр списка не будет отображаться до редактированиявыбран иКлавиатура появляется

Я уверен, что просмотр списка заполнен, и пользовательский просмотр списка работает

, но содержимое списка не отображается, пока я не выберу правку и не появится клавиатура, как будто просмотр списка спал, пока не был выбран правка.

вотпример enter image description here

см. в этом упражнении, а текст не выбран, поэтому даже если список заполнен, он не отображается.

но как только я нажимаю на него, он редактирует текст, и клавиатура появляется, как будто он просыпается из спящего списка enter image description here enter image description here

и просмотр списка и адаптер не анонимный, я определил их вот код активности, если необходимо для справки

public class UserHome extends AppCompatActivity {

    ListView listView;
    ArrayList<String> userOwnTweets;
    ArrayList<String> userOwnTweetsDate;
    ArrayList<String> getUserOwnTweetsObjectId;
    EditText tweetText;
    CustomArrayAdapter customArrayAdapter;
    Typeface custom_font1, custom_font2;

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

        custom_font1 = Typeface.createFromAsset(getAssets(),  "fonts/gooddog.otf");
        custom_font2 = Typeface.createFromAsset(getAssets(),  "fonts/quicksand.otf");

        listView = (ListView) findViewById(R.id.userListHome);
        tweetText = (EditText) findViewById(R.id.tweetText);

        userOwnTweets = new ArrayList<String>();
        userOwnTweetsDate = new ArrayList<String>();
        getUserOwnTweetsObjectId = new ArrayList<String>();


        customArrayAdapter = new CustomArrayAdapter(getApplicationContext());
        listView.setAdapter(customArrayAdapter);


        // updating the tweets onCreate
        updateTweetList();

    }


    public void updateTweetList(){

        // clearing the lists to avoid duplicate entries
        userOwnTweets.clear();
        userOwnTweetsDate.clear();
        getUserOwnTweetsObjectId.clear();



        // just backend code to get the tweets of the user
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Tweet");
        query.whereEqualTo("username", ParseUser.getCurrentUser().getUsername());
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {

                if (e == null && objects.size() > 0){

                    for (ParseObject object : objects){

                        String tempString = object.getString("tweet");
                        tempString = tempString.substring(0, Math.min(tempString.length(), 20));
                        tempString+="...";

                        // adding them to the arraylists
                        userOwnTweets.add(tempString);
                        userOwnTweetsDate.add(object.getString("date"));
                        getUserOwnTweetsObjectId.add(object.getObjectId());
                    }
                }
            }
        });

        // updating the customlistview for datastatechanged
        customArrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
        startActivity(intent);
        finish();
    }

    public void postTweetFunction(View view){



        // adding a new tweet and refreshing the tweet list from teh server
        ParseObject userTwitter = new ParseObject("Tweet");
        userTwitter.put("tweet", tweetText.getText().toString());
        userTwitter.put("username", ParseUser.getCurrentUser().getUsername());
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        userTwitter.put("date", String.valueOf(dateFormat.format(new Date())));
        userTwitter.saveInBackground(new SaveCallback() {
            @Override
            public void done(ParseException e) {

                if (e == null) {

                    Toast.makeText(getApplicationContext(), "Tweet Added", Toast.LENGTH_SHORT).show();
                    tweetText.setText("");
                    updateTweetList();

                }
            }
        });
        hideKeyBoard();


    }

    public void hideKeyBoard(){


        // hiding the keyboard
        try {
            InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }


    // the custom adapter
    class CustomArrayAdapter extends BaseAdapter {

        Context context;
        LayoutInflater layoutInflater;

        // Constructor
        public CustomArrayAdapter(Context context) {
            this.context = context;
            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return userOwnTweets.size();
        }

        @Override
        public Object getItem(int position) {
            return userOwnTweets.get(position);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {

            view = layoutInflater.inflate(R.layout.row_layout, null);

            TextView userHomeTweet = (TextView) view.findViewById(R.id.userHomeTweet);
            TextView userHomeTweetdate = (TextView) view.findViewById(R.id.userHomeTweetDate);
            userHomeTweet.setTypeface(custom_font1);
            userHomeTweetdate.setTypeface(custom_font2);

            try {
                userHomeTweet.setText(userOwnTweets.get(i));
                userHomeTweetdate.setText(userOwnTweetsDate.get(i));
            }catch(Exception e){
                e.printStackTrace();
            }

            // random color for each

            int color = Color.LTGRAY;
            view.setBackgroundColor(color);

            return view;
        }
    }

}

Я использовал правильное комментирование, код достаточно прост, я просто использую Сервер с MongoDB, я прокомментировалих.

, и это макет customlistview xml

<?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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/userHomeTweet"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="40dp"
        />

    <TextView
        android:id="@+id/userHomeTweetDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="49dp"
        android:textSize="20dp" />


</RelativeLayout>

каждый элемент списка имеет внутри каждого макета this следовательно, что делает его customlistview

ТАК, вот все, что я прояснил, насколько это возможно, но спросите меня, пропустил ли я что-нибудь, что может изменить ситуацию к решению проблемы

так что вы можете сказать мне, почему просмотр списка не даетпоказывать, пока я не выберу EditText и клавиатура не появится, кажется странной проблемой, пожалуйста, укажите мне правильное направление.Спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Попробуйте это

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/verticalLinear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    tools:context=".UserHome">

    <EditText
        android:id="@+id/tweetText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_toStartOf="@id/button"
        android:ems="10"
        android:hint="Write Your Tweet"
        android:inputType="textPersonName" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/userListHome"
        android:layout_alignParentEnd="true"
        android:onClick="postTweetFunction"
        android:text="Post" />


    <ListView
        android:id="@+id/userListHome"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tweetText"
        android:layout_alignParentBottom="true" />


</RelativeLayout>

РЕДАКТИРОВАТЬ

public void updateTweetList(){

        // clearing the lists to avoid duplicate entries
        userOwnTweets.clear();
        userOwnTweetsDate.clear();
        getUserOwnTweetsObjectId.clear();



        // just backend code to get the tweets of the user
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Tweet");
        query.whereEqualTo("username", ParseUser.getCurrentUser().getUsername());
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {

                if (e == null && objects.size() > 0){

                    for (ParseObject object : objects){

                        String tempString = object.getString("tweet");
                        tempString = tempString.substring(0, Math.min(tempString.length(), 20));
                        tempString+="...";

                        // adding them to the arraylists
                        userOwnTweets.add(tempString);
                        userOwnTweetsDate.add(object.getString("date"));
                        getUserOwnTweetsObjectId.add(object.getObjectId());
                    }

                   // updating the customlistview for datastatechanged
                   customArrayAdapter.notifyDataSetChanged();
                }
            }
        });


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...